
//数组中的第i个位置插入元素

#include <iostream>

using namespace std;

class SList
{
public:
    //构造函数，初始化一个指定大小的顺序表
    SList(int capacity)
    {
        //cout<<"构造函数"<<endl;
        this->capacity=capacity;
        this->elem = new int[this->capacity];
        //this->elem = (int *)malloc(this->capacity*sizeof(int)); //指定容量
        this->extendsize = 10;  //每次扩展容量
        this->length = 0;
    }
    //不指定，则初始化一个10大小的顺序表
    SList()
    {
       // cout<<"构造函数"<<endl;
        this->capacity=10;
        this->elem = new int[this->capacity];
        //this->elem = (int *)malloc(this->capacity*sizeof(int)); //默认容量
        this->extendsize = 10;
        this->length = 0;
    }
    //插入
    int insertOne(int i ,int item)
    {
       // cout<<"insert_i"<<endl;
        int *base;
        //再i位置插入item元素
        if(i<0 || i>=this->capacity)
        {
            return 0;  //非法插入
        }
        if(this->length==this->capacity) //长度和容量相等，重新分配内存
        {
            //c语言重新分配内存，realloc函数
            // 如果后面有连续内存，那么直接扩展
            // 如果后面没有连续内存，那么再堆重新分配，并把原来数据复制过去，返回头指针
            //base = (int *)realloc(this->elem,(this->capacity+this->extendsize)*sizeof(int));
            base = new int[this->capacity+this->extendsize];
            if(base ==NULL)
            {
                return 0; //重新分配内存失败
            }
            //复制
            for(int j = 0;j<this->length;j++)
            {
                base[i]=this->elem[i];
            }
            this->elem = base;
            if(base!=NULL)
            {
                delete[] base;
                base=NULL;
            }
            this->capacity = this->capacity+this->extendsize;
        }

        //数据插入,如果在尾部插入，那么直接插入，如果不再尾部插入，那么需要移动元素
        if(i>=this->length)
        {
            //尾部插入
            this->elem[i] = item;
            this->length++;
        }else
        {
            //不在尾部插入
            for(int j = this->length;j>i;j--)
            {
                //移动元素
                this->elem[j] = this->elem[j-1];
            }
            //插入
            this->elem[i] = item;
            this->length++;
        }
        return 1;

    }
    int insertOne(int item)
    {
        //cout<<"insertOne"<<endl;
        int *base;
        if(length==capacity)
        {
            base = new int[this->length+this->extendsize];
            if(base==NULL)
            {
                return 0;
            }
            for(int i =0;i<this->length;i++)
            {
                base[i] = this->elem[i];
            }
            this->elem = base;
            if(base!=NULL)
            {
                delete[] base;
                base = NULL;
            }
            this->capacity=this->capacity+this->extendsize;
        }
        this->elem[this->length] = item;
        this->length++;
        return 1;

    }
    //删除
    int removeOne(int i)
    {
        //
        //cout<<"remove"<<endl;
        if(i>=this->length)
        {
            return 0;
        }
        //删除i位置的元素
        //如果在尾部删除
        if(i==length-1)
        {
            this->length--;
        }
        //如果在中间删除
        if(i<length-1)
        {
            //需要移动元素
            for(int j = i;j<length;j++)
            {
                this->elem[i] = this->elem[i+1];
            }
            this->length--;
        }
        return 1;
    }

    void show()
    {
       // cout<<"显式元素"<<endl;
        //遍历元素
        for(int i = 0;i<this->length;i++)
        {
            cout<<this->elem[i]<<",";
        }
    }
    int getLength()
    {
       // cout<<"length"<<endl;
        return this->length;
    }
    ~ SList()
    {
        //析构
        //cout<<"析构函数"<<endl;
        if(elem!=NULL)
        {
            delete[] elem;
            elem = NULL;
        }
    }
private:
    int * elem;
    int length;
    int capacity;
    int extendsize; //如果空间不够，则每次扩展extendsize大小的空间
};

int main()
{

    //定义一个顺序列表
    SList my_list = SList();
    for(int k = 0;k <5;k++)
    {
        my_list.insertOne(k*k);
    }
    my_list.show();
    my_list.insertOne(3,300);
    my_list.show();
    cout<<endl;

    system("pause");
    return 0;
}
